/**
 * 给你一个整数数组 coins ，表示不同面额的硬币；以及一个整数 amount ，表示总金额。
 *
 * 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额，返回-1 。
 *
 * 你可以认为每种硬币的数量是无限的。
 *
 *
 *
 * 链接：https://leetcode.cn/problems/coin-change
 */
class CoinChange {
    public int coinChange(int[] coins, int amount) {
        int[] dp=new int[amount+1];
        Arrays.fill(dp,amount+1);
        dp[0]=0;
        for(int i=0;i<amount+1;i++) {
            for(int coin:coins) {
                if(i-coin<0) {
                    continue;
                } else {
                    dp[i]=Math.min(dp[i-coin]+1,dp[i]);
                }
            }
        }
        return dp[amount]==amount+1? -1 : dp[amount];
    }
}